home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
EnigmA Amiga Run 1997 May
/
EnigmA AMIGA RUN 18 (1997)(G.R. Edizioni)(IT)[!][issue 1997-05][EAR-CD II].iso
/
programs
/
write
/
docs
/
write.atg
< prev
Wrap
Text File
|
1996-09-16
|
7KB
|
697 lines
COMPILER WRITE
(* ------------------------ Scanner ----------------------------------- *)
CHARACTERS
letter = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".
digit = "0123456789" .
hexdigit = digit + "ABCDEFabcdef".
eol = CHR(10).
tab = CHR(9).
stringchar1 = ANY - '"' - "\" - eol.
stringchar2 = ANY - "'" - "\" - eol.
stringchar3 = ANY - "`" - "\" - eol.
escchar = ANY - eol.
TOKENS
(* Variablen fangen mit Unterstrich an. *)
ident = (letter | "_") {letter | digit | "_"}.
number = digit {digit}.
hexnumber = "0x" hexdigit {hexdigit}.
tag = "@" (letter | digit) {letter | digit}.
string = ('"' {stringchar1 | "\" escchar} '"')
| ("'" {stringchar2 | "\" escchar} "'")
| ("`" {stringchar3 | "\" escchar} "`").
rexxvar = "&" (letter | digit) {letter | digit | "."}.
posmark = "%" letter {letter}.
locale = "$" (letter) {letter | digit | "_"}.
IGNORE eol + tab
IGNORE CASE
COMMENTS FROM "(*" TO "*)" NESTED
(* ------------------------ Parser ------------------------------------- *)
PRODUCTIONS
WRITE
= Module
| Config
| Startup
| Locale
| Command
.
Module
=
"MODULE"
Ident
";"
{
Vars
| MacroDef ";"
| KeyDef ";"
| MenuDef ";"
}
Body
"END" Ident "."
.
Config
=
"CONFIG"
Ident ";"
[ UseList ]
{
Vars
| Prefs
| UsrFkt ";"
| Backup ";"
| Template ";"
| Syntax ";"
| Button ";"
}
Body
"END" Ident "."
.
Startup
=
"STARTUP" ";"
{
Vars
| Prefs
| UsrFkt ";"
| HotKey ";"
| Mode ";"
}
Body
"END" "."
.
Locale
=
"LOCALE"
Ident ";"
[ LocaleStr ":=" StringVar
{
";"
[
LocaleStr ":=" StringVar
]
}
]
"END" Ident
"."
.
Command
=
(
{
Vars
| MacroDef ";"
}
"BEGIN"
[StatementSeq]
"END" "."
)
|
(
[StatementSeq] EOF
)
.
Prefs
=
"PREFS" { PrefsDef ";" }
.
Vars
=
"VAR" {VarDef ";"}
.
Body
=
[ "BEGIN" [StatementSeq] ]
[ "CLOSE" [StatementSeq] ]
.
UseList
=
"IMPORT" Ident
{
"," Ident
}
";"
.
UsrFkt
=
"HOOK" Ident [StatementSeq]
"END" Ident
.
Backup
=
"BACKUP" Number StringVar StringVar
.
Template
=
"TEMPLATE" StringVar
["NOCASE" ]
["AUTO" ]
[StatementSeq]
"END"
.
SyntaxDescr
=
Number
Number
["BOLD" ]
["ITALIC" ]
["UNDERLINED" ]
.
Syntax
=
(
"TOKEN"
StringVar
["WORD" ]
SyntaxDescr
)
|
(
"STRING"
StringVar
StringVar
StringVar
SyntaxDescr
)
|
(
"PATTERN"
StringVar
SyntaxDescr
)
|
(
"COMMENT"
["START" ]
StringVar
StringVar
["NESTED" ]
SyntaxDescr
)
.
Button
=
(
"BUTTON"
StringVar
StatementSeq
"END"
)
|
(
"BUTTONSPACE"
)
.
HotKey
=
"HOTKEY" StringVar [StatementSeq]
"END"
.
Mode
=
"MODE" StringVar StringVar
.
PrefsDef
=
Identifier ":=" Expression
.
Type
=
(
"POINT"
| "NUMBER"
| "STRING"
)
.
VarDef
=
Ident [ "*" ]
{
","
Ident [ "*" ]
}
":"
Type
.
ParameterDef
=
[ "VAR" ]
Ident
{
","
Ident
}
":"
Type
.
MacroDef
=
"PROCEDURE" Ident
[ "*" ]
[
"(" [ ParameterDef { ";" ParameterDef }]")"
[ ":" Type ]
]
";"
[
"VAR" VarDef { ";" [VarDef] }
]
"BEGIN"
[StatementSeq ]
"END" Ident
.
KeyDef
=
"KEY" StringVar [StatementSeq] "END"
| "DOUBLEKEY" StringVar StringVar [StatementSeq] "END"
.
MenuDef
=
"MENU" NiceString
| "ITEM" NiceString NiceString [StatementSeq] "END"
| "ITEMBAR"
| "SUB" NiceString NiceString [StatementSeq] "END"
| "SUBBAR"
.
StatementSeq
=
Statement
{
";"
[
Statement
]
}
.
Statement
=
(
(
Designator
|
RexxVar
)
[
":="
Expression
]
)
| (
"IF"
Expression
"THEN" [StatementSeq]
{
"ELSIF"
Expression
"THEN" [StatementSeq]
}
[ "ELSE" [StatementSeq] ]
"END"
)
| (
"WHILE"
Expression
"DO"
[StatementSeq]
"END"
)
| (
"REPEAT"
[StatementSeq]
"UNTIL"
Expression
)
| (
"FOR"
Ident
":="
Expression
"TO" Expression
[
"BY" Expression
]
"DO"
[StatementSeq]
"END"
)
| (
"LOOP"
StatementSeq
"END"
)
| "EXIT"
| "RETURN"
[Expression]
.
Expression
=
SimpleExpr
[
Relation
SimpleExpr
]
.
SimpleExpr
=
[
"-"
]
Term
{
AddOp
Term
}
.
Term
=
Factor
{
MulOp
Factor
}
.
Factor
=
"STRING"
"("
Expression
")"
| "NUMBER"
"("
Expression
")"
| "FORMAT"
"("
Expression
{
","
Expression
}
")"
| "REGEXP"
"("
Expression
{
","
Expression
}
")"
| Designator
|
Number
|
StringVar
|
RexxVar
|
LocaleStr
| PointVar
| ("~" | "NOT"
) Factor
| "(" Expression ")"
.
Designator
=
Identifier
[
"["
Expression
[
":" Expression
]
"]"
]
[
"(" [ ExprList ] ")"
]
[
"{" TagList "}"
]
.
StringVar
=
string
.
PointVar
=
"["
( Expression
| PosMark
)
","
(
Expression
| PosMark
)
"]"
.
PosMark
=
posmark
.
Ident
=
ident
.
LocaleStr
=
locale
.
NiceString
=
(
StringVar
)
|
( LocaleStr
)
.
Identifier
=
Ident
["." Ident]
.
RexxVar
=
rexxvar
.
Number
=
( number
| hexnumber
)
.
TagList
=
Tag
{ "," Tag }
.
Tag
=
TagVar
[
"=" Expression
]
.
ExprList
=
Expression
{
","
Expression
}
.
Relation
=
"="
| "#"
| "<>"
| "<"
| "<="
| ">"
| ">="
.
AddOp
=
"+"
| "-"
| "OR"
| "|"
.
MulOp
=
"*"
| "DIV"
| "/"
| "MOD"
| "AND"
.
TagVar
=
tag
.
END WRITE.